package middleware

import (
	"github.com/gin-gonic/gin"
	"gvb_server/models/ctype"
	"gvb_server/models/res"
	"gvb_server/service/redis_ser"
	"gvb_server/utils/jwts"
)

// 中间件，因为有些功能的请求是需要用户登录的，所以我们将用户登录检查分装成为一个
// 中间件，这个中间件就是在用户请求该功能时，必须要经过的路径
func JwtAuth() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 先将 token 拿到
		token := c.Request.Header.Get("token")
		if token == "" {
			res.FailWithMessage("未携带 token", c)
			c.Abort()
			return
		}

		// 解析 token
		claims, err := jwts.ParseToken(token)
		if err != nil {
			res.FailWithMessage("token 错误", c)
			c.Abort()
			return
		}
		// 判断是否在redis中
		if redis_ser.CheckLogout(token) {
			res.FailWithMessage("token已失效", c)
			c.Abort()
			return
		}

		// 登录的用户
		c.Set("claims", claims)
	}
}

// 对于超级管理员权限
func JwtAdmin() gin.HandlerFunc {
	return func(c *gin.Context) {
		token := c.Request.Header.Get("token")
		if token == "" {
			res.FailWithMessage("未携带 token", c)
			c.Abort()
			return
		}
		claims, err := jwts.ParseToken(token)
		if err != nil {
			res.FailWithMessage("token错误", c)
			c.Abort()
			return
		}

		// 判断是否在redis中
		if redis_ser.CheckLogout(token) {
			res.FailWithMessage("token已失效", c)
			c.Abort()
			return
		}

		// 登录的用户
		if claims.Role != int(ctype.PermissionAdmin) {
			res.FailWithMessage("权限错误", c)
			c.Abort()
			return
		}
		c.Set("claims", claims)
	}
}
